# 生成器(generator->gen)
# 使用场景：介于生成器 按需分配，懒加载 的特点,
#         小内存计算机可以处理体格较为庞大的数据
# 1. 产生生成器的方式(函数内部yield关键字)
# 表示函数执行的暂停, 函数执行到yield就暂停，后续可以接着暂停的位置继续执行
import random
def func02():
    a = 1
    yield a  # 将变量a返回来，并且暂停函数的执行
    a = 2
    yield a
    a = 3
    yield a
gen = func02()  # 生成器: 按需分配，懒加载
print(gen)  # <generator object func02 at 0x7f7ff4749a98>
# 第一种获取生成器数据的方式
# print(gen.__next__())  # 1 获取yield返回的值
# print(gen.__next__())  # 2
# print(gen.__next__())  # 3
# 第二种获取生成器数据的方式
# for item in gen:
#     print(item)

# 2. 产生生成器的方式(生成器表达式)
temp = (random.randint(1, 10) for i in range(10))
print("temp:", temp)  # <generator object <genexpr> at 0x7f3e37184830>
for item in temp:
    print(item)

# 列表计算前一亿个数的和，小内存计算机直接被干掉
# 1. 将长度为1亿的列表加载到内存   2. 再去计算
# >>> sum([i for i in range(100000000)])
# 已杀死

# 生成器
# >>> sum((i for i in range(100000000)))  # 生成器的方式
# 4999999950000000
# >>> sum((i for i in range(1000000000)))  # 生成器的方式
# 499999999500000000



# 添加10个1~10的随机数
# list03 = [random.randint(1, 10) for i in range(10)]
# print("list03:", list03)



# def func01():  # return: 表示函数的终止,return后的代码都不会执行
#     a = 1
#     return a
#     print("return后的语句都不会执行")
#     a = 2
#     return a
#     a = 3
#     return a
# result = func01()
# print(result)  # 1
